{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "comet_ml is installed but `COMET_API_KEY` is not set.\n",
      "/usr/local/google/home/julesgm/anaconda3/lib/python3.8/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  /pytorch/c10/cuda/CUDAFunctions.cpp:100.)\n",
      "  return torch._C._cuda_getDeviceCount() > 0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.3.1\n"
     ]
    }
   ],
   "source": [
    "# Copyright 2020 Google LLC\n",
    "#\n",
    "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "#      http://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License.\n",
    "\n",
    "import collections\n",
    "import functools\n",
    "import itertools\n",
    "import os\n",
    "import pathlib\n",
    "import sys\n",
    "import textwrap\n",
    "\n",
    "import datasets\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import re\n",
    "import shutil\n",
    "import tensorflow as tf\n",
    "import tensorflow_hub as hub\n",
    "import transformers\n",
    "import tqdm\n",
    "\n",
    "sys.path.append(\"..\")\n",
    "import bert_utils\n",
    "import retrievers\n",
    "import utils\n",
    "\n",
    "\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Reusing dataset kilt_tasks (/usr/local/google/home/julesgm/.cache/huggingface/datasets/kilt_tasks/all_tasks/1.0.0/821c4295a2c35db2847585918d9c47d7f028f1a26b78825d8e77cd3aeb2621a1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset split keys: ['train', 'validation', 'test']\n"
     ]
    }
   ],
   "source": [
    "# Prepare different HuggingFace objects that will definitely be needed.\n",
    "\n",
    "kilt = datasets.load_dataset(\"kilt_tasks\")\n",
    "eli5 = {k.split(\"_\")[0]: v for k, v in kilt.items() if \"eli5\" in k}\n",
    "gpt2_tokenizer = transformers.GPT2TokenizerFast.from_pretrained(\"gpt2-xl\")\n",
    "print(f\"Dataset split keys: {list(eli5.keys())}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the configuration file for the retriever. This tells us where the reference file is and how many\n",
    "# entries it has.\n",
    "\n",
    "retriever_config = retrievers.REALMSave(\n",
    "      **utils.from_json_file(\"../configs/retriever_configs/realm_configs/local_cloudtop/open_source.json\")\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the reference text DB\n",
    "\n",
    "block_records_path=retriever_config.text_records\n",
    "num_block_records=retriever_config.num_block_records\n",
    "    \n",
    "blocks_dataset = tf.data.TFRecordDataset(block_records_path,\n",
    "                                       # Value taken from the REALM\n",
    "                                       # code.\n",
    "                                       buffer_size=512 * 1024 * 1024)\n",
    "\n",
    "blocks_dataset = blocks_dataset.batch(num_block_records,\n",
    "                                      drop_remainder=True)\n",
    "\n",
    "blocks = tf.data.experimental.get_single_element(blocks_dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert the DB to numpy\n",
    "\n",
    "np_blocks = blocks.numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100000/100000 [03:24<00:00, 488.65it/s]\n"
     ]
    }
   ],
   "source": [
    "# Extract the lengths of a number of entries\n",
    "\n",
    "lengths = []\n",
    "for line in tqdm.tqdm(np_blocks[:100000]):\n",
    "    lengths.append(len(gpt2_tokenizer(line.decode())[\"input_ids\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(275, 0.8048799999999995)\n",
      "(279, 0.8632899999999996)\n",
      "(280, 0.8760399999999996)\n",
      "(283, 0.9098399999999995)\n",
      "(285, 0.9286999999999995)\n",
      "(288, 0.9508699999999995)\n",
      "(294, 0.9771099999999995)\n"
     ]
    }
   ],
   "source": [
    "# Compute maximum lengths of a number of centiles\n",
    "# This is really quick and dirty, inefficient code.\n",
    "\n",
    "counter = collections.Counter(lengths)\n",
    "by_len = sorted(counter.items(), key=lambda pair: pair[0])\n",
    "maxes = []\n",
    "for max_percentage in (.8, .85, .875, .9, .925, .95, .975):\n",
    "    accum = {}\n",
    "    accum_v = 0\n",
    "    for len_, count in by_len:\n",
    "        if accum_v < max_percentage:\n",
    "            accum_v += count / len(lengths)\n",
    "            accum[len_] = accum_v\n",
    "    max_ = max(accum.items(), key=lambda x: x[0])\n",
    "    maxes.append(max_)\n",
    "    print(max_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAI/CAYAAABEVcwAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABrnUlEQVR4nO3deXiV1bn+8e+TCQhTmKcQxjBDAkQQZ1QQtRXngh5tHUpta6099Sit2tNBW0+tv9ZWLaXUodWKWkWxRXAGiiIJEOZ5SkKQKQlTCJme3x/Z0BAC2YGEnZ3cn+vKlb3fd629n7VjyO07rGXujoiIiIjUrIhQFyAiIiJSHylkiYiIiNQChSwRERGRWqCQJSIiIlILFLJEREREaoFCloiIiEgtiAp1AZVp27atd+/ePdRliIiIiFRp8eLFe9y9XcXtdTJkde/enbS0tFCXISIiIlIlM9tW2XadLhQRERGpBQpZIiIiIrVAIUtERESkFihkiYiIiNQChSwRERGRWqCQJSIiIlILFLJEREREakGVIcvMnjezXWa28iT7zcx+b2YbzWy5mQ0rt2+cma0L7Jtck4WLiIiI1GXBHMl6ERh3iv1XAomBr0nAHwHMLBJ4NrB/ADDRzAacSbEiIiIi4aLKkOXu84CcUzQZD/zVyywE4sysEzAC2Ojum929EJgeaCsiIiJS79XENVldgMxyz7MC2062XURERKTeq4mQZZVs81Nsr/xFzCaZWZqZpe3evbsGyhIREREJnZoIWVlA13LP44HsU2yvlLtPdfcUd09p1+6EhaxFREREwkpNhKyZwO2BuwzPBfa5+w4gFUg0sx5mFgNMCLQVERERqfeiqmpgZq8ClwBtzSwL+F8gGsDdpwCzgKuAjUA+cEdgX7GZ3QvMASKB5919VS2MQURERKTOqTJkufvEKvY78N2T7JtFWQgTERERaVA047uIiIhILVDIEhEREakFClkiIiIitUAhS0REJAw8/fTTDBo0iIEDB/K73/3u2Pavfe1rJCcnk5ycTPfu3UlOTj6h77p16461SU5OpkWLFsde46GHHmLIkCHcfvvtx9r/7W9/4+mnn66ypvz8fK6++mr69evHwIEDmTz5P8sUb9u2jcsuu4whQ4ZwySWXkJWVdVzf/fv306VLF+69997qfRBhRCFLRESkjlu5ciV//vOfWbRoEcuWLeOf//wnGzZsAOC1114jPT2d9PR0brjhBq6//voT+vft2/dYm8WLFxMbG8t1113Hvn37+Oyzz1i+fDklJSWsWLGCw4cP8+KLL/Kd73wnqNoeeOAB1q5dy9KlS1mwYAHvvffese233347y5cv5yc/+Qk/+tGPjuv36KOPcvHFF5/hJ3MSr7wC3btDRETZ91deqZ33qYJCloiISB23Zs0azj33XGJjY4mKiuLiiy9mxowZx7Vxd15//XUmTjzlpAB89NFH9OrVi27duhEREUFhYSHuzuHDh4mOjubJJ5/kvvvuIzo6usq6YmNjGT16NAAxMTEMGzbs2BGr1atXc9lllwEwevRo3nnnnWP9Fi9ezM6dOxk7dmy1PoegvPIKTJoE27ZRaJGwbVvZ8xAELYUsERGROm7QoEHMmzePvXv3kp+fz6xZs8jMzDyuzfz58+nQoQOJiYmnfK3p06cfC2LNmzfnhhtuYOjQofTo0YOWLVuSmprK+PHjj+uTnZ3NVVdddcrXzcvL49133z0WrJKSknjzzTcBmDFjBgcOHGDv3r2Ulpbywx/+kCeffLJan0HQHn4Yz89nyogbuOG/nuRgTBPIz4eHH66d9zsFhSwREZE6rn///jz00EOMGTOGcePGkZSURFTU8VNdvvrqq1UexSosLGTmzJncdNNNx7Y9+OCDpKen89RTT/Hoo4/y85//nGnTpnHzzTfz2GOPAdC5c2dmzTr5tJfFxcVMnDiR++67j549ewLwm9/8hrlz5zJ06FDmzp1Lly5diIqK4rnnnuOqq66ia9euJ329M1Gakcljl97NE6PvoEfudmKKi8p2ZGTUyvudSpWTkYqIiEjo3XXXXdx1110A/PjHPyY+Pv7YvuLiYt566y0WL158ytd47733GDZsGB06dDhh39KlSwHo06cP3//+95k3bx4TJkxgw4YNVR4dmzRpEomJidx///3HtnXu3Jm33noLgIMHD/Lmm2/SsmVLPv/8c+bPn89zzz3HwYMHKSwspFmzZjzxxBNBfQ6n4u7873U/5G+JF/ONtJn85KM/E4GX7UxIOOPXry6FLBERkTCwa9cu2rdvT0ZGBm+99Raff/75sX0ffvgh/fr1Oy54VeZUR7seffRRpk6dSlFRESUlJQBERESQn59/ytd85JFH2LdvH9OmTTtu+549e2jdujURERH86le/4s477wTg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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# We plot the results.\n",
    "\n",
    "plt.figure(figsize=(10, 10))\n",
    "plt.plot(accum.keys(), accum.values())\n",
    "for x, y in maxes:\n",
    "    plt.scatter(x=(x,), y=(y,), color=\"red\")\n",
    "plt.yticks(np.linspace(0, 1, 21))\n",
    "plt.xticks(np.linspace(0, 300, 11))\n",
    "for x, y in maxes:\n",
    "    plt.text(x - 45, y- 0.0075, f\"{y:0.1%}: {x}\", size=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}